﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Collections;

namespace GIFT
{
    class ConsultaActividad
    {
        public ConsultaActividad()
        {
            consulta = new Consulta();
        }

        /***************************** Consultas para datos basicos de actividades ***********************/

        //Obtiene de la base de datos todos las actividades existentes, y los retorna en un arreglo
        public ArrayList obtieneActividades()
        {
            ArrayList comandos = new ArrayList();
            String sentenciaSql;
            SqlDataReader datos;
            sentenciaSql = "Select nombre From [GIFT].[dbo].[actividad]";
            datos = consulta.HacerConsulta(sentenciaSql);
            if (datos != null)
            {
                while (datos.Read())
                {
                    comandos.Add(datos.GetValue(0).ToString());
                }
            }
            consulta.CierraConexion();
            return comandos;
        }

        //Busca nombres de las actividades que contengan la hilera que reciba como parametro en el nombre o la descripcion
        public ArrayList buscarConcordancias(String frase)
        {
            ArrayList campos = new ArrayList();
            String sentenciaSql;
            SqlDataReader datos;
            sentenciaSql = "Select nombre From [GIFT].[dbo].[actividad] Where nombre LIKE '%" + frase + "%' OR descripcion LIKE '%" + frase + "%'";
            datos = consulta.HacerConsulta(sentenciaSql);
            if (datos != null)
            {
                while (datos.Read())
                {
                    campos.Add(datos.GetValue(0).ToString());
                }
            }
            consulta.CierraConexion();
            return campos;
        }

        //Busca en la base de datos el atributo de la actividad con el nombre que recibe como parametro
        public String buscarAtributo(String nombre, String atributo)
        {
            String atr = "ERROR";
            SqlDataReader datos;
            String sentenciaSql = "Select " + atributo + " from [GIFT].[dbo].[actividad] Where nombre='" + nombre + "'";
            datos = consulta.HacerConsulta(sentenciaSql);
            if (datos != null) //si hay datos se llenan los campos
            {
                while (datos.Read())
                {
                    atr = datos.GetValue(0).ToString();
                    if (atr == "NULL")
                    {
                        atr = "";
                    }
                }
            }
            consulta.CierraConexion(); //Cierra conexion
            return atr;
        }

        public bool existeActividad(String nombre)
        {
            SqlDataReader datos;
            String sentenciaSql;
            sentenciaSql = "Select nombre From [GIFT].[dbo].[actividad]  Where nombre ='" + nombre + "'";
            datos = consulta.HacerConsulta(sentenciaSql);
            if (datos.HasRows)//lo que se haga para saber si no retorno resultados 
            {
                consulta.CierraConexion();//Cierra la conexion
                return true;
            }
            consulta.CierraConexion();//Cierra la conexion
            return false;
        }

        //Borrar una actividad
        public void borrarActividad(String nombre)
        {
            String sentenciaSql = "DELETE FROM [GIFT].[dbo].[actividad] WHERE nombre ='" + nombre + "'";//crea la consulta
            consulta.HacerConsulta(sentenciaSql);//la ejecuta
            consulta.CierraConexion();//cierra la conexion
        }

        public void crearNuevaActividad(String nombre, String descripcion, String esquemaFlujoTrabajo, String tipo, String estadoInicial, String estadoFinal, String cardinalidad, String plazo, String repetible, String masiva)
        {
            String sentenciaSql = "INSERT INTO [GIFT].[dbo].[actividad]([nombre],[descripcion],[fecha actualizacion],[id esquema flujo trabajo],[tipo],[estado inicial],[estado final],cardinalidad,plazo,repetible,masiva,)VALUES('" + nombre + "','" + descripcion + "',(GetDate()), " + esquemaFlujoTrabajo + ",'" + tipo + "','" + estadoInicial + "','" + estadoFinal + "','" + cardinalidad + "'," /*(GetDate())*/+ plazo + "," + repetible + "," + masiva + ")";
            SqlDataReader datos = consulta.HacerConsulta(sentenciaSql);
            consulta.CierraConexion();//Cierra la conexion
        }

        //Modifica un comando en la base de datos
        public void modificarActividad(String nombre, String descripcion, String esquemaFlujoTrabajo, String tipo, String estadoInicial, String estadoFinal, String cardinalidad, String plazo, String repetible, String masiva)
        {
            String sentenciaSql; //va a guardar la consulta a realizar                        
            sentenciaSql = "UPDATE [GIFT].[dbo].[comando]SET [descripcion] = '" + descripcion + "',[fecha actualizacion] = (GetDate()),[id esquema flujo trabajo]" + esquemaFlujoTrabajo + ",[tipo] = '" + tipo + "',[estado inicial] = " + estadoInicial + "',[estado final] = " + estadoFinal + "',[cardinalidad] = " + cardinalidad + "',[plazo] = " + /*(GetDate())*/plazo + ",[repetible] = " + repetible + ",[masiva] = " + masiva + "WHERE [nombre] = '" + nombre + "'";
            consulta.HacerConsulta(sentenciaSql); //Ejecuta la consulta
            consulta.CierraConexion();//Cierra la conexion
        }

        //Modifica un atributo de un comando en la base de datos, si el valor es una hilera debe de venir como "'hilera'"
        public void actualizarAtributoActividad(String nombre, String atributo, String valorAtributo)
        {
            String sentenciaSql; //va a guardar la consulta a realizar                        
            sentenciaSql = "UPDATE [GIFT].[dbo].[actividad] SET [" + atributo + "] = " + valorAtributo + ",[fecha actualizacion] = (GetDate()) WHERE [nombre] = '" + nombre + "'";
            consulta.HacerConsulta(sentenciaSql); //Ejecuta la consulta
            consulta.CierraConexion();//Cierra la conexion
        }

        //Busca en la base de datos todos los atributos del comando sin mascara
        public ArrayList atributosActividad(String nombre)
        {
            ArrayList atributos = new ArrayList();
            String sentenciaSql = "SELECT * FROM [GIFT].[dbo].[actividad] WHERE [nombre] = " + nombre;
            SqlDataReader datos = consulta.HacerConsulta(sentenciaSql);
            if (datos != null)
            {
                while (datos.Read())
                {
                    atributos.Add(datos.GetValue(0).ToString());
                }
            }
            consulta.CierraConexion();
            return atributos;
        }

        public String obtenerAtributoActividad(String nombre, String nombreAtributo)
        {
            String atributo = "";
            SqlDataReader datos;
            String sentenciaSql = "Select [" + nombreAtributo + "] from [GIFT].[dbo].[actividad] Where nombre='" + nombre + "'";
            datos = consulta.HacerConsulta(sentenciaSql);
            if (datos != null)
            {
                if (datos.Read())
                {
                    atributo = datos.GetValue(0).ToString();
                }
            }
            consulta.CierraConexion(); //Cierra conexion
            return atributo;
        }

        public ArrayList comandosActividad(String nombreActividad)
        {
            ArrayList comandos = new ArrayList();
            //los comandos de una actividad devuelve en orden 
            String idAct = obtenerAtributoActividad(nombreActividad, "id");
            String sentenciaSql = "SELECT [id orden],[id comando] FROM [GIFT].[dbo].[comando de actividad] WHERE [id actividad] = " + idAct;
            SqlDataReader datos = consulta.HacerConsulta(sentenciaSql);
            if (datos != null)
            {
                while (datos.Read())
                {
                    comandos.Add(datos.GetValue(0).ToString()); //orden
                    comandos.Add(datos.GetValue(1).ToString()); //comando
                }
                comandos.Sort(); //ordena el arreglo
            }
            consulta.CierraConexion();
            return comandos;
        }

        //"liga" un comando a una actividad
        public void agregarComandoActividad(String nombreActividad, String idComando, String orden)
        {
            String idAct = obtenerAtributoActividad(nombreActividad, "id");
            String sentenciaSql = "INSERT INTO [GIFT].[dbo].[comando de actividad]([id actividad],[id comando],[id orden])VALUES(" + idAct + "," + idComando + "," + orden + ")";
            SqlDataReader datos = consulta.HacerConsulta(sentenciaSql);
            consulta.CierraConexion();//Cierra la conexion
        }

        public void agregarHija(String nombreActMadre, String nombreActHija, String relacion)
        {
            String idAct = obtenerAtributoActividad(nombreActMadre, "id");
            String idHija = obtenerAtributoActividad(nombreActHija, "id");
            String sentenciaSql = "INSERT INTO [GIFT].[dbo].[madre_hija_Actividad]([id madre],[id hija],[relacion])VALUES(" + idAct + "," + idHija + ",'" + relacion + "')";
            SqlDataReader datos = consulta.HacerConsulta(sentenciaSql);
            consulta.CierraConexion();//Cierra la conexion
        }

        public String obtenerMadre(String nombreHija)
        {
            String nombreMadre = "";
            String idHija = obtenerAtributoActividad(nombreHija, "id");
            String idMadre = "";
            //obtener el id de la madre
            String sentenciaSql = "SELECT [id madre] FROM [GIFT].[dbo].[madre_hija_Actividad] WHERE [id hija] = " + idHija;
            SqlDataReader datos = consulta.HacerConsulta(sentenciaSql);
            if (datos != null)
            {
                while (datos.Read())
                {
                    idMadre = datos.GetValue(0).ToString();
                }
            }
            consulta.CierraConexion();
            nombreMadre = obtenerNombre(idMadre);
            return nombreMadre;
        }

        public String obtenerNombre(String id)
        {
            String nombreAct = "";
            //obtener el nombre de la actividad
            String sentenciaSql = "SELECT [nombre] FROM [GIFT].[dbo].[actividad] WHERE [id] = " + id;
            SqlDataReader datos = consulta.HacerConsulta(sentenciaSql);
            if (datos != null)
            {
                while (datos.Read())
                {
                    nombreAct = datos.GetValue(0).ToString();
                }
            }
            consulta.CierraConexion();
            return nombreAct;
        }

        public void agregarHermana(String hermana1, String hermana2, String relacion)
        {
            String idHermana1 = obtenerAtributoActividad(hermana1, "id");
            String idHermana2 = obtenerAtributoActividad(hermana2, "id");
            String sentenciaSql = "INSERT INTO [GIFT].[dbo].[hermana_hermana_Actividad]([id hermana 1],[id hermana 2],[relacion])VALUES(" + idHermana1 + "," + idHermana2 + ",'" + relacion + "')";
            SqlDataReader datos = consulta.HacerConsulta(sentenciaSql);
            consulta.CierraConexion();//Cierra la conexion
        }

        //devuelve los ids y la relacion de las hermanas de una actividad
        public ArrayList obtenerHermanas(String nombreHermana1)
        {
            ArrayList hermanas = new ArrayList();
            String idAct = obtenerAtributoActividad(nombreHermana1, "id");
            String sentenciaSql = "SELECT [id hermana 2],[relacion] FROM [GIFT].[dbo].[hermana_hermana_Actividad] WHERE [id hermana 1] = " + idAct;
            SqlDataReader datos = consulta.HacerConsulta(sentenciaSql);
            if (datos != null)
            {
                while (datos.Read())
                {
                    hermanas.Add(datos.GetValue(0).ToString()); //id de las hermanas
                    hermanas.Add(datos.GetValue(1).ToString()); //relacion
                }
            }
            consulta.CierraConexion();
            return hermanas;
        }
        //devuelve los ids y la relacion de las hijas de una actividad
        public ArrayList obtenerHijas(String nombreMadre)
        {
            ArrayList hijas = new ArrayList();
            String idAct = obtenerAtributoActividad(nombreMadre, "id");
            String sentenciaSql = "SELECT [id hija],[relacion] FROM [GIFT].[dbo].[madre_hija_Actividad] WHERE [id madre] = " + idAct;
            SqlDataReader datos = consulta.HacerConsulta(sentenciaSql);
            if (datos != null)
            {
                while (datos.Read())
                {
                    hijas.Add(datos.GetValue(0).ToString()); //id de las hijas
                    hijas.Add(datos.GetValue(1).ToString()); //relacion
                }
            }
            consulta.CierraConexion();
            return hijas;
        }
        public ArrayList obtieneActividadesCompuestas()
        {
            ArrayList nombres_de_actividades = new ArrayList();
            SqlDataReader datos;

            String sentenciaSql = "Select nombre from [GIFT].[dbo].[actividad] Where [tipo] = 'Compuesta'";
            //String sentenciaSql = "Select nombre from [GIFT].[dbo].[actividad]";

            datos = consulta.HacerConsulta(sentenciaSql);

            if (datos != null)
            {

                while (datos.Read())
                {

                    nombres_de_actividades.Add(datos.GetValue(0).ToString());

                }

            }

            consulta.CierraConexion(); //Cierra conexion
            return nombres_de_actividades;
        }

        //Atributos de la clase
        private Consulta consulta;
    }
}
